package ar.com.muebleria.view.ventanasInternas;

import java.awt.Dimension;
import java.awt.Font;
import java.awt.Rectangle;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.ArrayList;
import javax.swing.DefaultComboBoxModel;
import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JInternalFrame;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.JTextField;
import javax.swing.table.DefaultTableModel;

import org.apache.log4j.Logger;

import ar.com.muebleria.beans.Familia;
import ar.com.muebleria.beans.Producto;
import ar.com.muebleria.beans.SubFamilia;
import ar.com.muebleria.model.dao.DAOCombos;
import ar.com.muebleria.model.dao.DAOProducto;
import ar.com.muebleria.util.Validador;

public class VistaIngreso extends JInternalFrame {

	private static final long serialVersionUID = 1L;
	private static VistaIngreso myInstance;  
	private JLabel txt1 = null;
	private JLabel txt2 = null;
	private JLabel txt3 = null;
	
	private JComboBox generos = null;
	private JComboBox generos1 = null;

	private JTextField origen = null;
	
	private JButton reset = null;
	private JButton newProducto = null;
	
	private DefaultTableModel modelo = null;
	
	private JScrollPane jScrollPane = null;
	private JTable jTable = null;
	private JButton ingresar = null;
	private JPanel jContentPane = null;

	private ArrayList<String> productos;
	private ArrayList<String> familias;
	
	private DefaultComboBoxModel dcProductos;
	
	private VistaIngreso() {
		super();
	}

	/**
	 * This method initializes this
	 * 
	 * @return void
	 */
	private void initialize() {
		modelo = new DefaultTableModel();
		modelo.addColumn("codigo");
		modelo.addColumn("descripcion");
		modelo.addColumn("cantidad");
		this.setTitle("Ventana de ingreso de productos:");
		this.setSize(new Dimension(550, 400));
		this.setFont(new Font("Comic Sans MS", Font.PLAIN, 12));
		this.setClosable(true);
		this.setResizable(false);
		this.setContentPane(getJContentPane());
		this.setDefaultCloseOperation(JInternalFrame.HIDE_ON_CLOSE);
		this.setVisible(true);
		this.addInternalFrameListener(new javax.swing.event.InternalFrameAdapter() {
			public void internalFrameClosing(javax.swing.event.InternalFrameEvent e) {
				myInstance = null;
			}
		});
	}

	/**
	 * This method initializes jContentPane
	 * 
	 * @return javax.swing.JPanel
	 */
	private JPanel getJContentPane() {
		if (jContentPane == null) {
			txt3 = new JLabel();
			txt3.setBounds(new Rectangle(13, 73, 100, 25));
			txt3.setText(" Cantidad:");
			txt3.setFont(new Font("Times-Roman", Font.BOLD, 17));
			txt2 = new JLabel();
			txt2.setBounds(new Rectangle(13, 43, 100, 25));
			txt2.setText(" Producto:");
			txt2.setFont(new Font("Times-Roman", Font.BOLD, 17));
			txt1 = new JLabel();
			txt1.setBounds(new Rectangle(13, 13, 100, 25));
			txt1.setText(" Familia:");
			txt1.setFont(new Font("Times-Roman", Font.BOLD, 17));
			jContentPane = new JPanel();
			jContentPane.setLayout(null);
			jContentPane.setSize(new Dimension(645, 368));
			jContentPane.add(txt1, null);
			jContentPane.add(txt2, null);
			jContentPane.add(txt3, null);
			jContentPane.add(getGeneros(), null);
			jContentPane.add(getGeneros1(), null);
			jContentPane.add(getOrigen(), null);
			jContentPane.add(getJScrollPane(), null);
			jContentPane.add(getReset(), null);
			jContentPane.add(getNewProducto(), null);
			jContentPane.add(getIngresar(), null);
		}
		return jContentPane;
	}
	public static VistaIngreso getInstance(ArrayList<String> familias , ArrayList<String> productos){
		if(myInstance == null){
			myInstance = new VistaIngreso();
			myInstance.setFamilias(familias);
			myInstance.setProductos(productos);
			myInstance.initialize();
		}
		return myInstance;
	}
	/**
	 * This method initializes generos	
	 * 	
	 * @return javax.swing.JComboBox	
	 */
	private JComboBox getGeneros() {
		if (generos == null) {
			DefaultComboBoxModel dc = new DefaultComboBoxModel();
			
			
			dc.addElement("Elija Familia...");
			for(String opcion : familias)
				dc.addElement(opcion);
			
			generos = new JComboBox(dc);
			generos.setBounds(new Rectangle(124, 13, 164, 25));
			generos.setFont(new Font("Times-Roman", Font.BOLD, 17));
			generos.addActionListener(new ActionListener() {
	            public void actionPerformed(ActionEvent e) {
	            	dcProductos.removeAllElements();
	    			
	    			dcProductos.addElement("Elija producto...");
	    			
	    			String sel = (String) generos.getSelectedItem();
	    			
	    			if(sel.indexOf("-") == -1)
	    				return;
	    			
	            	DAOCombos dao = new DAOCombos();
	            	
	            	sel = sel.substring(0,sel.indexOf("-"));
	            	String parametros = "ID_FAMILIA = "+ sel;
	            	ArrayList<String> productosInt = dao.obtenerComboParametros("sub_familia", "ID_SUB_FAMILIA", "DESCRIPCION",parametros);
	            	for(String opcion : productosInt)
	    				dcProductos.addElement(opcion);
	            }
	        });
		}
		return generos;
	}
	/**
	 * This method initializes generos	
	 * 	
	 * @return javax.swing.JComboBox	
	 */
	private JComboBox getGeneros1() {
		if (generos1 == null) {
			dcProductos = new DefaultComboBoxModel();
			
			dcProductos.addElement("Elija producto...");
			
			generos1 = new JComboBox(dcProductos);
			generos1.setBounds(new Rectangle(124, 43, 164, 25));
			generos1.setFont(new Font("Times-Roman", Font.BOLD, 17));
			
		}
		return generos1;
	}


	/**
	 * This method initializes origen	
	 * 	
	 * @return javax.swing.JTextField	
	 */
	private JTextField getOrigen() {
		if (origen == null) {
			origen = new JTextField();
			origen.setBounds(new Rectangle(124, 73, 166, 25));
			origen.setFont(new Font("Times-Roman", Font.BOLD, 17));
		}
		return origen;
	}


	/**
	 * This method initializes reset	
	 * 	
	 * @return javax.swing.JButton	
	 */
	private JButton getReset() {
		if (reset == null) {
			reset = new JButton();
			reset.setText("Reset");
			reset.setBounds(new Rectangle(300, 73, 141, 25));
			reset.setFont(new Font("Times-Roman", Font.BOLD, 17));
			reset.addActionListener(new java.awt.event.ActionListener() {
				public void actionPerformed(java.awt.event.ActionEvent e) {
					origen.setText("");

					generos.setSelectedItem("Elija Familia...");
					dcProductos.removeAllElements();
	    			
	    			dcProductos.addElement("Elija producto...");
	    			
	    			int cantRows = modelo.getRowCount();
	    			for(int i=0 ; i < cantRows ; i++)
	    				modelo.removeRow(cantRows - 1 - i);
				}
			});
		}
		return reset;
	}

	private JButton getNewProducto(){
		if (newProducto == null) {
			newProducto = new JButton();
			newProducto.setText("Nuevo Producto");
			newProducto.setBounds(new Rectangle(300, 43, 141, 25));
			newProducto.setFont(new Font("Times-Roman", Font.BOLD, 13));
			newProducto.addActionListener(new java.awt.event.ActionListener() {
				public void actionPerformed(java.awt.event.ActionEvent e) {
					
				}
			});
		}
		return newProducto;
	
		
	}
	/**
	 * This method initializes jScrollPane	
	 * 	
	 * @return javax.swing.JScrollPane	
	 */
	private JScrollPane getJScrollPane() {
		if (jScrollPane == null) {
			jScrollPane = new JScrollPane();
			jScrollPane.setBounds(new Rectangle(14, 106, 500, 250));
			jScrollPane.setViewportView(getJTable());
		}
		return jScrollPane;
	}

	/**
	 * This method initializes jTable	
	 * 	
	 * @return javax.swing.JTable	
	 */
	private JTable getJTable() {
		if (jTable == null) {
			jTable = new JTable(modelo);
			jTable.setFont(new Font("Times-Roman", Font.BOLD, 17));
//			jTable.addMouseListener(new java.awt.event.MouseAdapter() {
//				public void mouseClicked(java.awt.event.MouseEvent e) {
//					origen.setText((modelo.getValueAt(jTable.getSelectedRow(),2)).toString());
//					generos.setSelectedItem((modelo.getValueAt(jTable.getSelectedRow(),4)).toString());
//				}
//			});
		}
		return jTable;
	}
	/**
	 * This method initializes ingresar	
	 * 	
	 * @return javax.swing.JButton	
	 */
	private JButton getIngresar() {
		if (ingresar == null) {
			ingresar = new JButton();
			ingresar.setBounds(new Rectangle(300, 13, 141, 25));
			ingresar.setText("Agregar");
			ingresar.setFont(new Font("Times-Roman", Font.BOLD, 17));
			ingresar.addActionListener(new java.awt.event.ActionListener() {
				public void actionPerformed(java.awt.event.ActionEvent e) {
					ingresar();
				}
			});
		}
		return ingresar;
	}

	private void ingresar(){
		Logger.getLogger("VistaIngreso").info("Iniciando la validacion de los datos.");
		Validador vali = new Validador();
			
		Logger.getLogger("VistaIngreso").info("Obteiendo el familia.");
		String sel = (String) generos.getSelectedItem();
		Logger.getLogger("VistaIngreso").info("Familia: " + sel);	
		
		if(!vali.validarCodigo(sel)){
			Logger.getLogger("VistaIngreso").info("Error en la familia.");
			return;
		}
			
		Logger.getLogger("VistaIngreso").info("Obteiendo el producto.");
		sel = (String) generos1.getSelectedItem();
		Logger.getLogger("VistaIngreso").info("Producto: " + sel);	
			
		if(!vali.validarCodigo(sel)){
			Logger.getLogger("VistaIngreso").info("Error en el producto.");
			return;
		}
		
		Logger.getLogger("VistaIngreso").info("Obteiendo la cantidad.");
		sel = (String) generos1.getSelectedItem();
		Logger.getLogger("VistaIngreso").info("Cantidad: " + origen.getText());
		
		if(!vali.isNum(origen.getText())){
			Logger.getLogger("VistaIngreso").info("Error en la cantidad.");
			return;
		}
			
		String codigoFamilia = (String) generos.getSelectedItem();
		codigoFamilia = codigoFamilia.substring(0,codigoFamilia.indexOf("-")).trim();
		
		String codigoProducto = (String) generos1.getSelectedItem();
		codigoProducto = codigoProducto.substring(0,codigoProducto.indexOf("-")).trim();
		
		String codigo = codigoFamilia + "." + codigoProducto;
		
		DAOProducto daoProducto = new DAOProducto();
		
		String descripcion = daoProducto.obtenerDescripcionProducto(codigoFamilia,codigoProducto);
		
		if(!vali.validarDescripcion(descripcion)){
			Logger.getLogger("VistaIngreso").info("Error en el codigo.");
			return;
		}
		
		Familia familia = new Familia();
		familia.setFamliaId(codigoFamilia);
		SubFamilia subFamilia = new SubFamilia();
		subFamilia.setFamilia(familia);
		subFamilia.setSubFamiliaId(codigoProducto);
		Producto producto = new Producto();
		producto.setSubFamilia(subFamilia);
		producto.setDescripcion(descripcion);
		producto.setCantidadStock(Integer.parseInt(origen.getText()));
		
		int respuesta = daoProducto.insertarProductos(producto);
		
		if(respuesta == 0){
			Logger.getLogger("VistaIngreso").info("Los productos no se agregaron al stock. ");
			return;
		}
		
		Object [] fila = new Object[3];
		producto.setProductoId("");
		fila[0]=producto.codigoCompleto();
		fila[1]=producto.getDescripcion();
		fila[2]=origen.getText();
		modelo.addRow( fila );
		origen.setText("");
		generos.setSelectedItem("Elija Familia...");
		dcProductos.removeAllElements();
		
		dcProductos.addElement("Elija producto...");
	}

	public ArrayList<String> getProductos() {
		return productos;
	}

	public void setProductos(ArrayList<String> productos) {
		this.productos = productos;
	}

	public ArrayList<String> getFamilias() {
		return familias;
	}

	public void setFamilias(ArrayList<String> familias) {
		this.familias = familias;
	}


}  //  @jve:decl-index=0:visual-constraint="10,10"
